<?php
/**
 * 框架核心组件
 * Class Z
 * @author  ZhouHaoHua <53027327@qq.com>
 * @package
 */
use \core\models as cm;
class Z {
    private static $S;
    private function __construct(){}

    /**
     * 数组处理模块
     * @return \core\models\Arrays
     */
    public static function Arrays(){
        return cm\Arrays::getStatic();
    }

    /**
     * 字符处理模板
     * @return \core\models\Strings
     */
    public static function Strings(){
        if(empty(self::$S['Strings'])) {
            self::$S['Strings'] = new cm\Strings();
        }
        return self::$S['Strings'];
    }

    /**
     * 数字处理，包括税
     * @return \core\models\Number
     * @author lwkai
     * @date   20
     */
    public static function Number(){
        if(empty(self::$S['Number'])) {
            self::$S['Number'] = new cm\Number();
        }
        return self::$S['Number'];
    }

    /**
     * 令牌处理
     * @param string $name 令牌变量名称，建议使用表单的名称作为令牌名称
     * @return \core\models\Token
     */
    public static function Token($name = 'phpToken'){
        $t = 'Token'.$name;
        if(empty(self::$S[$t])) {
            self::$S[$t] = new cm\Token($name);
        }
        return self::$S[$t];
    }

    /**
     * 网络处理
     * @return cm\Network
     */
    public static function Network(){
        if(empty(self::$S['Network'])) {
            self::$S['Network'] = new cm\Network();
        }
        return self::$S['Network'];
    }
    /**
     * 系统处理
     * @return cm\System
     */
    public static function System(){
        if(empty(self::$S['System'])) {
            self::$S['System'] = new cm\System();
        }
        return self::$S['System'];
    }

    /**
     * 密码处理
     * @return cm\Password
     */
    public static function Password(){
        if(empty(self::$S['Password'])) {
            self::$S['Password'] = new cm\Password();
        }
        return self::$S['Password'];
    }

    /**
     * 网站消息提示类
     * @return cm\MessageStack
     */
    public static function MessageStack(){
        if(empty(self::$S['MessageStack'])) {
            self::$S['MessageStack'] = new cm\MessageStack();
        }
        return self::$S['MessageStack'];
    }

    /**
     * Html处理类
     * @return cm\Html
     */
    public static function Html(){
        if(empty(self::$S['Html'])) {
            self::$S['Html'] = new cm\Html();
        }
        return self::$S['Html'];
    }

    /**
     * cUrl对象处理
     * @param $url 目标地址
     * @return cm\Curl
     */
    public static function Curl($url = null){
        return (new cm\Curl($url));
    }
    /**
     * 小物件类
     * @author  ZhouHaoHua <53027327@qq.com>
     * @return \Widget | cm\Widget
     */
    public static function Widget(){
        if(empty(self::$S['Widget'])) {
            if (class_exists('\Widget')) {
                self::$S['Widget'] = new \Widget();
            }else{
                self::$S['Widget'] = new cm\Widget();
            }
        }
        return self::$S['Widget'];
    }

    /**
     * 小工具类
     * @return \Tools | cm\Tools
     * @author ZhouHaoHua <53027327@qq.com>
     */
    public static function Tools(){
        if(empty(self::$S['Tools'])) {
            if (class_exists('\Tools')) {
                self::$S['Tools'] = new \Tools();
            }else{
                self::$S['Tools'] = new cm\Tools();
            }
        }
        return self::$S['Tools'];
    }

    /**
     * Debug
     * @return cm\Debug
     */
    public static function Debug(){
        return (new cm\Debug());
    }

    /**
     * 目录\文件处理
     * @return cm\DirFile
     */
    public static function DirFile(){
        return (new cm\DirFile());
    }

    /**
     * 前端视图处理类
     * 【注意】只适用于项目文件位于www文件夹下面的项目
     * @return cm\Views
     */
    public static function Views(){
        return (new cm\Views());
    }

    /**
     * 缓存处理
     * @param string $type   类型，可选：Memcache，Mysql。默认：Memcache
     * @return cm\Cache_Mysql
     */
    public static function Cache($type = 'Memcache'){
        $c = cm\Cache::open($type);
        return $c;
    }

    /**
     * 创建一个HTTP RPC Server
     * @param   $obj 要开放的对象
     * @return cm\Rpc_Server
     * @author ZhouHaoHua <53027327@qq.com>
     */
    public static function Rpc_Server($obj){
        return new cm\Rpc_Server($obj, 'Yar');
    }

    /**
     * 创建一个HTTP RPC客户端实例
     * @param $uri 服务器的资源地址。如果是多用多线程调用的话这里设置为空值如:null
     * @return cm\Rpc_C_Yar
     * @author ZhouHaoHua <53027327@qq.com>
     */
    public static function Rpc_Client($uri){
        return cm\Rpc_Client::get($uri, 'Yar');
    }

    /**
     * 错误异常处理
     * @param string $message
     * @param int    $code
     * @param int    $severity
     * @param string $filename
     * @param int    $lineno
     * @param        $previous
     * @return cm\Error
     * @author ZhouHaoHua <53027327@qq.com>
     */
    public static function Error($message = "", $code = 0, $severity = 1, $filename = __FILE__, $lineno = __LINE__, $previous = NULL){
        return new cm\Error($message, $code, $severity, $filename, $lineno, $previous);
    }
    public static function Thread(){
        return new cm\Thread();
    }

    /**
     * 日志记录
     * @param string $message      要记录的日志信息
     * @param string $__FUNCTION__ 当前方法名称。请传 __FUNCTION__ 过来即可。若手工指定了$file的地址，此参数可传空值。
     * @param string $file         要记录到哪个文件位置？【注意】默认不需要指定地址，默认文件目录在log/当前记录的文件方法地址。例如：
     *                             <pre>
     *                             在 models\Configuration.php的init方法中插入了一行日志\Z::Log('日志内容',__FUNCTION__);那么该日志的保存地址就在：log/models/Configuration/init.log这个文件中
     *                             </pre>
     * @return cm\Log
     */
    public static function Log($message, $__FUNCTION__, $file =''){
        return new cm\Log($message, $__FUNCTION__, $file);
    }
}